#include <stdio.h>

int main() {
    // 数组初始化的时候会将没有初始化的变量初始化为 0
    int int_array_01[10] = {0, 1, 2, 3, 4};

    int_array_01[0] = 100;
    int_array_01[2] = 200;

    // 计算数组长度
    printf("%lu", sizeof(int_array_01) / sizeof(int_array_01[0]));  // 10
    printf("\n");
    printf("\n");

    // 100 1 200 3 4 0 0 0 0 0
    for (int i = 0; i < 10; ++i) {
        printf("%d ", int_array_01[i]);
    }
    printf("\n");
    printf("\n");

    // 最小的地址单位是一个字节
    // int 类型的数据将占用 4 个内存地址
    // int 数组类型的数据将连续占用多个 4 个内存地址
    for (int i = 0; i < 10; ++i) {
        printf("%p ", &int_array_01[i]);
    }
    printf("\n");
    printf("\n");

    printf("%lu ", &int_array_01[0]);       // 首元素地址
    printf("%lu ", &int_array_01[0] + 1);   // 元素地址加一, 跨过一个元素
    printf("%lu ", int_array_01 + 1);       // 元素地址加一, 跨过一个元素
    printf("%lu ", &int_array_01 + 1);      // 整个数组地址加一, 跨过整个数组
    printf("\n");
    printf("\n");

    char char_array[] = "abcde";            // 定义了一个字符串数组, 存储的是 abcde\0;
    printf("%d\n", sizeof(char_array));     // 6
    printf("%s\n", char_array);             // abcde
    // printf 输出字符串时, 遇到 \0 结束字符串的输出
    printf("\n");

    // 通过指针可以操作数组元素
    int int_array_02[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    int *p = int_array_02, *q = NULL;
    for (int i = 0; i < 10; ++i) {
        // 四种访问 int_array_02 数组的方法
        // 数组的本质还是指针
        // printf("%d ", int_array_02[i]);
        // printf("%d ", *(int_array_02 + i)); // int_array_02[i] 等效于 *(int_array_02 + i)
        // printf("%d ", *(p + i));
        printf("%d ", p[i]); // p[i] 等效于 *(p + i)
    }
    printf("\n");
    printf("\n");

    // &int+array 是数组的地址
    // 数组的地址加一跨过整个数组, 数组的地址转为 int * 减一则取数组的最后一个元素的地址
    p = (int *) (&int_array_02 + 1) - 1;
    // int_array 是数组第一个元素的地址, 等效于 &int_array[0]
    // 第一个元素的地址加一跨过一个元素的地址, 及数组第二个元素的地址
    q = int_array_02 + 1;
    printf("*p = %d\n", *p);        // 9
    printf("*q = %d\n", *q);        // 1
    printf("p - q = %d\n", p - q);  // 8
    // 等效于 q 与 p 之间有多少个元素
    printf("\n");

    // [] 符号不是数组专用的 [] 等效于 *()
    // p[0] = *(p + 0)
    int value_number_01 = 100;
    p = &value_number_01;
    p[0] = 200;
    printf("value_number_01 = %d\n", value_number_01);  // 200
    printf("\n");
    return 0;
}